{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造特征矩阵 X 和标签 y（同一数据在下面也会使用）\n",
    "X = np.array([[5, 1],\n",
    "              [4, 2],\n",
    "              [2, 5],\n",
    "              [1, 4],\n",
    "              [3, 2],\n",
    "              [2, 5]])\n",
    "\n",
    "# 标签: 0 表示动作片偏好, 1 表示喜剧片偏好\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置邻居数量并创建 KNN 模型\n",
    "k = 1\n",
    "knn = KNeighborsClassifier(n_neighbors=k)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造特征矩阵 X 和标签 y\n",
    "# 每一行表示一个用户对电影A和电影B的评分\n",
    "X = np.array([[5, 1],  # 用户1\n",
    "              [4, 2],  # 用户2\n",
    "              [2, 5],  # 用户3\n",
    "              [1, 4],  # 用户4\n",
    "              [3, 2],  # 用户5\n",
    "              [2, 5]]) # 用户6\n",
    "\n",
    "# 标签: 0 表示动作片偏好, 1 表示喜剧片偏好\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted label (numeric): 1\n",
      "Predicted preference: 喜剧片\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAHJCAYAAABg0/b8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB71klEQVR4nO3deVxU1fsH8M/AsAq4gAQoi/uOIFiQewrmiqllioXiWpammaW5L6mlSVmpGYq7Vig/t8zlK7jnAppbZgaiLOKOyjYw5/cHw8TIsAzMMMz4eb9evHTuPffc55k7I4/3nnuuRAghQEREREQw0XcARERERFUFCyMiIiIiBRZGRERERAosjIiIiIgUWBgRERERKbAwIiIiIlJgYURERESkwMKIiIiISIGFEREREZECCyMiANHR0ZBIJPDw8CixXefOnSGRSBAREVEpcWmDh4cHJBIJJBIJtmzZUmy706dPK9tJJJJKjPA/BbHq0rBhw1TylEgksLKyQtOmTTFx4kSkpqbqdP8Fzp07h8DAQNSoUUMZR0JCQqXsm4iKJ9V3AERUeTZt2oTBgwerXbdx48ZKjka/2rVrh4YNGwIA0tLScOrUKYSFhWHr1q04efJkqUVyRTx58gR9+/ZFSkoKOnfuDFdXV0gkEtjY2Ohsn0RUNiyMiF4Q3t7e+P3333H37l3Url1bZV1ubi62bduG5s2b48aNG8jOztZLjIcOHYJMJquUfY0cORLDhg1Tvr579y569uyJs2fPYvLkyfj11191tu8zZ84gOTkZ77zzDtavX6+z/RCR5ngpjegFMXToUOTm5uLnn38usm7//v1IS0vD0KFD9RDZfxo0aICmTZvqZd+1a9fG0qVLAQB79uzRaYF2+/ZtAED9+vV1tg8iKh8WRkRacP/+fUybNg0tWrSAjY0NqlevjsaNG+Pdd9/F6dOni7S/e/cuJk+ejCZNmsDS0hI1a9ZEjx49cOTIkSJtC8Y/DRs2DKmpqRg5ciTq1q0LqVSKsLCwMsfYr18/2NjYqL1ktnHjRkgkEgwZMqTEPk6ePImgoCDUrl0bFhYW8PDwwPvvv4/k5GSVdkuXLoVEIsFnn31WbF89e/aERCLBgQMHlMtKGmOUkJCAMWPGwMPDAxYWFqhduzYGDhyIP//8s8SYNeHt7Q0AyMrKwr179wD8NyYpOjoav//+O7p06aIcF/To0SPltrt27UL37t1hb28PS0tLNG7cGDNmzMDTp09VcpBIJAgJCQEAzJkzRzm+qPDZKwA4duwY3njjDTg6Oirf6/Hjx+Pu3btF4tZmjAUKxtMlJCQgKioKfn5+qFatGmrVqoXBgwcri7vnCSGwadMmdO3aVbmf+vXrY8iQITh+/HiR9hcvXkRwcDDq1KkDCwsLuLi4YPjw4RxvRfojiEgcPnxYABDu7u4ltuvUqZMAINauXatc9uTJE9GwYUMBQDRq1Ej0799f9O/fX/j6+gqpVCpmzZql0sfVq1dFnTp1BADRoEED8cYbb4iOHTsKc3NzYWJiIjZt2qQ2tp49e4q6desKJycnMXDgQNG7d2+xatWqUnNzd3cXAERKSooYOnSoACD++ecf5fqnT58Ka2tr0bFjRyGEEBYWFkLdPw0bNmwQpqamQiKRiHbt2om3335bNG7cWAAQL730krh69aqybVJSkjAxMRFubm5CLpcX6evu3btCKpUKJycnkZubWyTW5x09elTY2dkJAKJFixZi4MCBwt/fX0gkEmFlZSX+97//lfo+FAgJCSlyDAvHDUAAEPfv31dpP2rUKCGRSETbtm3F22+/Ldq2bSsePXokhBBi0qRJAoCwtLQUHTt2FP3791fm4uPjI54+farMOyQkRLRr104AEK1btxYhISEiJCRErF69WhnHN998IyQSiTA1NRX+/v5i4MCBomnTpgKAqFevnkhOTlabkzZiLFDwWf/kk0+EiYmJePnll0X//v2Fq6ur8rOekZGhsk1ubq4YOHCgACAsLCxE165dxaBBg4S/v7+wtLQUISEhKu1//fVXYW5uroxh4MCBwtvbWwAQ9vb24tKlS2U+rkTawsKISFSsMFq7dq0AID788MMi7e/cuSMuXryofJ2bmytatmwpAIhvvvlGpWiIjY0V9vb2olq1auLOnTtFYgMg3njjDZGZmalRboULo3379gkAYs6cOcr169evFwCURZa6wigxMVFYWVkJqVQqdu3apVyel5cnPvroIwFAtG3bVmWb1157TQAQR44cKRLT999/LwCIjz76SG2shT1+/Fg4OTkJMzMz8csvv6isO3DggDA3Nxd16tQR2dnZZXo/SiqMVq5cKQCIOnXqFGkPQGzdurXINtu2bRMAhLe3t4iPj1cuz8nJEaNHjxYAxOTJk1W2KfjMPF80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iIiIiPRB45mvDx8+rIs4iIiIiPRO48IIAG7fvo2dO3ciMTEROTk5Kuu+/vprrQRGREREVNk0LowOHTqEvn37ol69erh27RpatmyJhIQECCHQpk0bXcRIREREVCk0vl1/6tSp+Pjjj3Hp0iVYWloiMjISt27dQqdOnfDmm2/qIkYiIiKiSqFxYXT16lXlTNhSqRSZmZmwsbHB3LlzsXjxYq0HSERERFRZNC6MqlWrhuzsbACAi4sLbty4oVx379497UVGREREVMk0HmPk5+eH48ePo3nz5ujVqxc+/vhjXLx4Edu3b4efn58uYiQiIiKqFBoXRl9//TWePn0KAJg9ezaePn2Kbdu2oWHDhspJIImIiIgMkUaFUV5eHm7dugVPT08AgLW1NX744QedBEZERERU2TQaY2Rqaoru3bvj0aNHOgqHiIiISH80HnzdqlUr/Pvvv7qIhYiIiEivNC6MFixYgMmTJ2P37t1ISUlBenq6yg8RERGRodJ48PXrr78OAOjbty8kEolyuRACEokEeXl52ouOiIiIqBLxIbJEREREChoXRp06ddJFHERERER6p/EYIyIiIiJjxcKIiIiISIGFEREREZGCXgujFStWwNPTE3Z2drCzs4O/vz9+++23EreJiYmBj48PLC0tUb9+faxcubKSoiUiIiJjV+HCKCcnR/nsNE3VrVsXixYtwtmzZ3H27Fm89tprCAoKwuXLl9W2j4+PR8+ePdGhQwfExcVh2rRpGD9+PCIjIyuSAhEREREADQujtWvX4sMPP8SmTZsAAFOnToWtrS2qV6+OgIAA3L9/X6Od9+nTBz179kTjxo3RuHFjLFiwADY2Njh16pTa9itXroSbmxvCwsLQrFkzjBw5EqGhoViyZIlG+yUiIiJSp8y36y9YsAALFizAq6++is2bN+PYsWOIiorC3LlzYWJigm+//RbTp0/HihUryhVIXl4efvnlFzx79gz+/v5q25w8eRKBgYEqy7p3747w8HDIZDKYmZkV2SY7OxvZ2dnK1wWzc8tkMshksnLFWpyC/rTdb1Vh7PkBxp8j8zN8xp4j8zN8usqxst4ziRBClKVho0aNMHfuXAwePBhnz57FK6+8gm3btmHgwIEAgN9++w1jx47FzZs3NQrg4sWL8Pf3R1ZWFmxsbLB582b07NlTbdvGjRtj2LBhmDZtmnLZiRMn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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 构造 new_user 并预测\n",
    "new_user = np.array([[3, 4]])\n",
    "# 训练模型\n",
    "knn.fit(X, y)\n",
    "# 预测新用户的偏好\n",
    "prediction = knn.predict(new_user)\n",
    "# 将数字标签映射为可读的文本\n",
    "label_map = {0: '动作片', 1: '喜剧片'}\n",
    "print('Predicted label (numeric):', prediction[0])\n",
    "print('Predicted preference:', label_map[int(prediction[0])])\n",
    "\n",
    "# 可视化部分\n",
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 用不同颜色标记两类用户（0: 动作片, 1: 喜剧片）\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', s=80, edgecolor='k')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "plt.plot(new_user[0,0], new_user[0,1], marker='x', color='red', markersize=8, label='New user')\n",
    "\n",
    "# 获取最近邻信息（距离和索引）\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "# idx 的形状为 (1, k)，取第一个近邻的索引并获取坐标\n",
    "nearest = X[idx[0][0]]  # 最近邻点的坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0,0], nearest[0]], [new_user[0,1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "\n",
    "# 标注最近邻点以便可视化（用绿色圈）\n",
    "plt.scatter(nearest[0], nearest[1], facecolors='none', edgecolors='green', s=200, linewidths=2, label='Nearest neighbor')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "image",
   "language": "python",
   "name": "image"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
